package br.com.caelum.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import br.com.caelum.modelo.Contato;
import br.com.caelum.util.ConnectionFactory;

public class ContatoDAO {
	
	private Connection connection;
	
	public ContatoDAO() throws ClassNotFoundException{
		this.connection = new ConnectionFactory().getConnection();
	}
	
	//insert
	public void adiciona(Contato contato){
		
		//query
		String sql = "insert into contatos" + "(nome, email, endereco, dataNascimento)" + "values(?,?,?,?)";
		
		try{
			//prepared statement para inserção
			PreparedStatement stmt = (PreparedStatement) connection.prepareStatement(sql);
			
			//Seta os valores
			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
			
			//executa
			stmt.execute();
			stmt.close();
			
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
	
	//atualiza
	public void altera(Contato contato){
		
		//query
		String sql = "update contatos set nome=?, email=?, endereco=?," + "dataNascimento=? where id=?";

		
		try{
			//prepared statement para atualização
			PreparedStatement stmt = (PreparedStatement) connection.prepareStatement(sql);
			
			//Seta os valores
			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
			stmt.setLong(5, contato.getId());

			
			//executa
			stmt.execute();
			stmt.close();
			
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
		
	//remove
	public void remove(Contato contato){
		
		//query
		String sql = "delete from contatos where id=?";
		
		try{
			//prepared statement para remoção
			PreparedStatement stmt = (PreparedStatement) connection.prepareStatement(sql);
			
			//Seta os valores
			stmt.setLong(1, contato.getId());
			
			//executa
			stmt.execute();
			stmt.close();
			
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
	
	//lista
	public List<Contato> getLista(){
		
		try{
			List<Contato> contatos = new ArrayList<Contato>();
			PreparedStatement stmt = (PreparedStatement) this.connection.prepareStatement("select * from contatos");
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				//criando o contato
				Contato contato = new Contato();
				contato.setId(rs.getLong("id"));
				contato.setNome(rs.getString("nome"));
				contato.setEmail(rs.getString("email"));
				contato.setEndereco(rs.getString("endereco"));
				
				//montando a data através do Calendar
				Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("dataNascimento"));
				contato.setDataNascimento(data);
				
				//adicionando o objeto a lista
				contatos.add(contato);
			}
			
			rs.close();
			stmt.close();
			
			return contatos;
			
		}catch(SQLException e){
			throw new RuntimeException(e);

		}
		
		
	}

}
